home *** CD-ROM | disk | FTP | other *** search
/ Sound Fx / Sound Fx.iso / Software / UNZIPED / SBPLY254 / SOURCE.ZIP / SNDSHELL.C < prev    next >
C/C++ Source or Header  |  1996-09-12  |  52KB  |  2,249 lines

  1. /***************************************************************************/
  2. /* SndShell.c  -- Routines to display sound files                          */
  3. /* Copyright (c) 1995 John A. Ball                                         */
  4. /*                                                                         */
  5. /* This source is available for your own personal use only! You may make   */
  6. /* any changes you wish but please do not distribute modified source code. */
  7. /* Please notify me of any errors or improvements.                         */
  8. /*                                                                         */
  9. /* must use large or compact model to build                                */
  10. /* i.e.   qcl/AL /c sndshell.c                                             */
  11. /*                                                                         */
  12. /* by John A. Ball   September 12, 1996                                    */
  13. /***************************************************************************/
  14.  
  15.  
  16. /***************************************************************************/
  17. #include "sbplay.h"
  18. /***************************************************************************/
  19.  
  20. extern int error;
  21. extern int multi_error;
  22. extern int default_bits;
  23. extern int play_rate;
  24. extern int magnitude;
  25. extern int volume;
  26. extern int ctwav;
  27. extern int ctsnd;
  28. extern int ctsam;
  29. extern int ctvoc;
  30. extern int rip;
  31. extern int file_info;
  32. extern char * msg;
  33. int play_sound(char * file_name);
  34.  
  35. #include <fcntl.h>
  36. #include <io.h>
  37. #include <sys\types.h>
  38. #include <sys\stat.h>
  39. #include <bios.h>
  40. #include <conio.h>
  41. #include <stdio.h>
  42. #include <dos.h>
  43. #include <errno.h>
  44. #include <stdlib.h>
  45. #include <graph.h>
  46. #include <search.h>
  47. #include <string.h>
  48. #include <time.h>
  49. #include <mouse.h>
  50.  
  51. #define ESC 27
  52. #define ORIGIN x=3,y=6;
  53. #define CR 13
  54. #define BS 8
  55. #define ShTAB 271
  56. #define HOME 327
  57. #define UPAR 328
  58. #define PGUP 329
  59. #define LFAR 331
  60. #define RGAR 333
  61. #define KEND 335
  62. #define DNAR 336
  63. #define PGDN 337
  64. #define TAB 9
  65. #define F1 315
  66. #define F2 316
  67. #define F3 317
  68. #define F4 318
  69. #define F5 319
  70. #define F6 320
  71. #define F7 321
  72. #define F8 322
  73. #define F9 323
  74. #define F10 324
  75. #define BREAK -1
  76.  
  77. char const TOP[]={218,196,196,196,196,196,196,196,196,196,
  78.           196,196,196,196,196,196,196,196,196,196,
  79.           196,196,196,196,196,196,196,196,196,196,
  80.           196,196,196,196,196,196,196,196,196,196,
  81.           196,196,196,196,196,196,196,196,196,196,
  82.           196,196,196,196,196,196,196,196,196,196,
  83.           196,196,196,196,196,196,196,196,196,196,
  84.           196,196,196,196,196,196,196,196,196,191};
  85. char const BOX[]={179,32,32,32,32,32,32,32,32,32,
  86.           32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
  87.           32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
  88.           32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
  89.           32,32,32,32,32,32,32,32,32,179};
  90. char const BOTTOM[]={192,196,196,196,196,196,196,196,196,196,
  91.           196,196,196,196,196,196,196,196,196,196,
  92.           196,196,196,196,196,196,196,196,196,196,
  93.           196,196,196,196,196,196,196,196,196,196,
  94.           196,196,196,196,196,196,196,196,196,196,
  95.           196,196,196,196,196,196,196,196,196,196,
  96.           196,196,196,196,196,196,196,196,196,196,
  97.           196,196,196,196,196,196,196,196,196,217};
  98. char const COMMAND1[]={32,17,196,217,32,'t','o',32,'h','e',
  99.              'a','r',32,32,32,32,32,32,32,32,
  100.              176,32,70,49,32,67,104,97,110,103,
  101.              101,32,68,101,102,97,117,108,116,115,
  102.              176,32,70,50,32,82,101,97,100,32,
  103.              68,105,114,101,99,116,111,114,121,32,
  104.              176,32,70,51,32,67,104,97,110,103,
  105.              101,32,68,114,105,118,101,32,32,32,
  106.              0};
  107. char const COMMAND2[]={32,70,52,32,'C','o','n','v','e','r',
  108.              't',32,'t','o',32,'W','A','V',32,32,
  109.              176,32,70,53,32,'R','i','p',32,32,
  110.              32,32,32,32,32,32,32,32,32,32,
  111.              176,32,70,54,32,'S','o','u','n','d',
  112.              32,'I','n','f','o',32,32,32,32,32,
  113.              176,32,70,55,32,'F','i','l','e',32,
  114.              'I','n','f','o',32,32,32,32,32,32,
  115.              0};
  116. char const COMMAND3[]={32,70,56,32,'C','o','n','v','e','r',
  117.              't',32,'t','o',32,'V','O','C',32,32,
  118.              176,32,70,57,32,'D','e','l','e','t',
  119.              'e',32,32,32,32,32,32,32,32,32,
  120.              176,32,70,49,48,32,'R','e','n','a',
  121.              'm','e',32,32,32,32,32,32,32,32,
  122.              176,32,69,115,99,32,116,111,32,101,
  123.              120,105,116,32,32,32,32,32,32,
  124.              0};
  125. char const UA[]={180,174,195,0};
  126. char const DA[]={180,175,195,0};
  127. char const LINE[]={196,196,196,0};
  128.  
  129. char const HELP1[]="Arrow keys to move \nEscape to quit\nPgUp for previous page\n";
  130. char const HELP5[]="PgDn for next page\nEnter key to select file or\n  change directories\n";
  131. char const HELP6[]="D Delete File\nR Rename File\n";
  132. char const HELP7[]="C Copy File";
  133. char *errors[13]={
  134.           {"Attempt to write to a write-protected disk"},
  135.           {"Unknown unit"},
  136.           {"Drive not ready"},
  137.           {"Unknown command"},
  138.           {"Data error"},
  139.           {"Bad request structure length"},
  140.           {"Seek error"},
  141.           {"Unknown media type"},
  142.           {"Sector not found"},
  143.           {"Printer out of paper"},
  144.           {"Write fault"},
  145.           {"Read fault"},
  146.           {"General failure"}};
  147.  
  148. char ulc[]={32,0,218,0,201,0,213,0,214,0};
  149. char vl[]={32,0,179,0,186,0,179,0,186,0};
  150. char urc[]={32,0,191,0,187,0,184,0,183,0};
  151. char hl[]={32,0,196,0,205,0,205,0,196,0};
  152. char llc[]={32,0,192,0,200,0,212,0,211,0};
  153. char lrc[]={32,0,217,0,188,0,190,0,189,0};
  154.  
  155. int snd_shell(void);
  156. void display_help();
  157. void display_menu(void);
  158. void display_intro(void);
  159. int show_files(char *fnp,int num);
  160. char *get_files(char *fnp);
  161. int find_files(void);
  162. int show_cursor(char *fnp, int cp);
  163. char *play_it(char *fnp);
  164. char *new_dir(char *fnp);
  165. char *update_dir(char *fnp);
  166. int show_file_info(char *fnp);
  167. void clear_display(void);
  168. int *save_screen(int x1, int y1, int x2, int y2);
  169. int restore_screen(int *screen, int x1, int y1, int x2, int y2);
  170. int get_char(int x, int y,int page);
  171. void put_char(int Char, int x, int y,int page);
  172. void draw_box(int type, int x1, int y1, int x2, int y2, int Char);
  173. void set_defaults();
  174. void get_rate(void);
  175. void get_vol(void);
  176. int save_defaults(void);
  177. void _interrupt _cdecl _far brk_handler();
  178. void print_page(void);
  179. void print_q(void);
  180. void print_dv(void);
  181. void print_number(unsigned rate);
  182. unsigned input_number(int row, int col);
  183. int get_key(void);
  184. void _far error_handler(unsigned deverror, unsigned errcode, unsigned _far *devhdr);
  185. void change_drive(void);
  186. int mouse_event(void);
  187. void give_cpu(void);
  188. int delete(char *fnp);
  189. int ren_file(char *fnp);
  190. int copyfile(char *fnp);
  191. char *datestr( unsigned d, char *buf );
  192. int display_exit(void);
  193. int find_dv(void);
  194. char *get_path(void);
  195. int get_defaults(void);
  196. char *get_string(char *string,int start);
  197. void reg_SBPlay(void);
  198.  
  199.    long fileinfo(struct find_t *find);
  200.    int num=0;
  201.    int pages=1;
  202.    int old_page=1;
  203.    int cur_page=1;
  204.    int cp=1;
  205.    int old_cp=1;
  206.    char *fnp=NULL;
  207.    int remainder=1;
  208.    int display_max=1;
  209.    int error;
  210.    time_t p_time;
  211.    time_t c_time;
  212.    int *screen;
  213.    int num_floppies=0;
  214.    int num_drives=0;
  215.    int old_drive=-1;
  216.    static char path[_MAX_PATH];
  217.    static char default_path[_MAX_PATH];
  218.    int Mouse=0;
  219.    int disk_error=0;
  220.    int disk_errors=0;
  221.    char fmsg[]="Error! ";
  222.    int in_dv=0;
  223.    char *reg_owner;
  224.    char ser_number[10];
  225.    char reg_name[40];
  226.  
  227. int snd_shell(void)
  228. {
  229.     short blink, oldcur, fgd, oldfgd;
  230.     long bgd,oldbgd;
  231.     int i=0, j=0;
  232.     int key=0;
  233.     struct find_t find;
  234.     char *fn;
  235.     int x=3,y=6;
  236.     int *screen;
  237.     struct rccoord oldpos;
  238.  
  239.     _dos_setvect(0x23,brk_handler);
  240.     _harderr(error_handler);
  241.  
  242.     /* Save original foreground, backgroud, and text position. */
  243.  
  244.     oldcur = _settextcursor(0x2000);
  245.     screen=save_screen(1, 1, 25, 80);
  246.     oldfgd = _gettextcolor();
  247.     oldbgd = _getbkcolor();
  248.     oldpos = _gettextposition();
  249.     
  250.     /* Save original path */
  251.  
  252.     getcwd(path,_MAX_PATH);
  253.  
  254.     strcpy(reg_name,"Unregistered");
  255.     strcpy(ser_number,"000000");
  256.  
  257.     _setbkcolor(1);
  258.     _clearscreen(_GCLEARSCREEN);
  259.     _setbkcolor(9);
  260.  
  261.     _settextcolor(15);
  262.     _settextposition(1,1);
  263.     _outmem(TOP,80);
  264.     _settextposition(2,1);
  265.     for (j=0;j<20;j++)
  266.     {
  267.      _outmem(BOX,80);
  268.     }
  269.     _settextposition(22,1);
  270.     _outmem(BOTTOM,80);
  271.     _settextposition(22,6);
  272.     _outtext(VERSION);
  273.    time(&p_time);
  274.     display_intro();
  275.     _settextcolor(11);
  276.     _settextposition(23,1);
  277.     _outtext(COMMAND1);
  278.     _outtext(COMMAND2);
  279.     _outtext(COMMAND3);
  280.  
  281.     Mouse=MouseInit();
  282.  
  283.     if(Mouse){
  284.       SetPtrPos(2,2);
  285.       SetPtrVis(SHOW);
  286.     }
  287.  
  288.     in_dv=find_dv();
  289.     get_defaults();
  290.     time(&c_time);
  291.     while((c_time-p_time) < 5){
  292.      time(&c_time);
  293.     };
  294.  
  295.      fnp=new_dir(fnp);
  296.  
  297.     while(key!=ESC){
  298.     show_cursor(fnp,cp);
  299.     old_cp=cp;
  300.     disk_errors=0;
  301.     key=get_key();
  302.     switch (key){
  303.        case CR:
  304.          fnp=play_it(fnp);
  305.          break;
  306.        case 'c':
  307.        case 'C':
  308.          disk_error=copyfile(fnp);
  309.          if(disk_error){
  310.            time(&p_time);
  311.            while((c_time-p_time) < 2){
  312.          time(&c_time);
  313.            };
  314.          }
  315.          fnp=update_dir(fnp);
  316.          display_menu();
  317.          break;
  318.        case 'D':
  319.        case 'd':
  320.          disk_error=delete(fnp);
  321.          fnp=update_dir(fnp);
  322.          break;
  323.        case 'R':
  324.        case 'r':
  325.          disk_error=ren_file(fnp);
  326.          fnp=update_dir(fnp);
  327.          break;
  328.        case '@':
  329.          reg_SBPlay();
  330.          break;
  331.        case HOME:
  332.          cp=1;
  333.          break;
  334.        case UPAR:
  335.          if(cp>1)cp-=1;
  336.          break;
  337.        case PGUP:
  338.          if(cur_page>1){
  339.            cur_page-=1;
  340.            cp=1;
  341.            old_cp=1;
  342.            if(cur_page==pages)display_max=remainder;
  343.            else display_max=72;
  344.            show_page(fnp,num);
  345.          }
  346.          break;
  347.        case KEND:
  348.          cp=display_max;
  349.          break;
  350.        case DNAR:
  351.          cp+=1;
  352.          if(cp>display_max)cp=display_max;
  353.          break;
  354.        case PGDN:
  355.          if(cur_page < pages){
  356.            cur_page+=1;
  357.            cp=1;
  358.            old_cp=1;
  359.            if(cur_page==pages)display_max=remainder;
  360.            else display_max=72;
  361.            show_page(fnp,num);
  362.          }
  363.          break;
  364.        case TAB:
  365.        case RGAR:
  366.          cp+=18;
  367.          if(cp>display_max)cp-=18;
  368.          break;
  369.        case ShTAB:
  370.        case LFAR:
  371.          cp-=18;
  372.          if(cp<1)cp+=18;
  373.          break;
  374.        case '?':
  375.          display_help();
  376.          break;
  377.        case F1:
  378.          set_defaults();
  379.          fnp=new_dir(fnp);
  380.          break;
  381.        case F2:
  382.          fnp=new_dir(fnp);
  383.          break;
  384.        case F3:
  385.          change_drive();
  386.          fnp=new_dir(fnp);
  387.          break;
  388.        case F4:
  389.          ctwav=1;
  390.          fnp=play_it(fnp);
  391.          ctwav=0;
  392.          fnp=update_dir(fnp);
  393.          break;
  394.        case F5:
  395.          rip=1;
  396.          ctsam=1;
  397.          fnp=play_it(fnp);
  398.          rip=0;
  399.          ctsam=0;
  400.          fnp=update_dir(fnp);
  401.          break;
  402.        case F6:
  403.          file_info=1;
  404.          fnp=play_it(fnp);
  405.          file_info=0;
  406.          break;
  407.        case F7:
  408.          show_file_info(fnp);
  409.          break;
  410.        case F8:
  411.          ctvoc=1;
  412.          fnp=play_it(fnp);
  413.          ctvoc=0;
  414.          fnp=update_dir(fnp);
  415.          break;
  416.        case F9:
  417.          disk_error=delete(fnp);
  418.          fnp=update_dir(fnp);
  419.          break;
  420.        case F10:
  421.          disk_error=ren_file(fnp);
  422.          fnp=update_dir(fnp);
  423.          break;
  424.        case ESC:
  425.          key=display_exit();
  426.          break;
  427.        default:
  428.          give_cpu();
  429.          break;
  430.     }}
  431.       if(fnp!=NULL)free(fnp);
  432.  
  433.     if(Mouse)SetPtrVis(HIDE);
  434.     
  435.     /* Restore original drive and directory */
  436.  
  437.     if(old_drive>=0)_dos_setdrive(old_drive,&num_drives);
  438.     chdir(path);
  439.  
  440.     /* Restore original foreground and background. */
  441.     
  442.     _settextcolor(oldfgd);
  443.     _setbkcolor(oldbgd);
  444.     _clearscreen(_GCLEARSCREEN );
  445.     restore_screen(screen, 1, 1, 25, 80);
  446.     _settextwindow(1,1,25,80);
  447.     _settextposition(oldpos.row, oldpos.col);
  448.     _settextcursor(oldcur);
  449.     return(0);
  450.  
  451. }
  452.  
  453. int find_files(void)
  454. {
  455.    struct find_t find;
  456.    int i=0;
  457.  
  458.    if(!_dos_findfirst("*.*", _A_NORMAL | _A_SUBDIR, &find))
  459.    {
  460.     if(strcmp(find.name,"."))
  461.      i++;
  462.      while(!_dos_findnext(&find))
  463.      {
  464.       i++;
  465.      }
  466.      pages=(i-1)/72 + 1;
  467.    }
  468.    return(i);
  469. }
  470.  
  471. char *get_files(char *fnp)
  472. {
  473.    struct find_t find;
  474.    char *fn;
  475.    int i=0;
  476.  
  477.    fn=fnp;
  478.    if(!_dos_findfirst("*.*", _A_NORMAL | _A_SUBDIR, &find)){
  479.      if(strcmp(find.name,".")){
  480.        if(!(find.attrib & _A_NORMAL))strcpy(fn,"D");
  481.        if(!(find.attrib & _A_SUBDIR)){
  482.      strcpy(fn,"N");
  483.      if(strstr(find.name,".VOC"))strcpy(fn,"F");
  484.      if(strstr(find.name,".WAV"))strcpy(fn,"F");
  485.      if(strstr(find.name,".IFF"))strcpy(fn,"F");
  486.      if(strstr(find.name,".SND"))strcpy(fn,"F");
  487.      if(strstr(find.name,".AIF"))strcpy(fn,"F");
  488.      if(strstr(find.name,".AU"))strcpy(fn,"F");
  489.      if(strstr(find.name,".SAM"))strcpy(fn,"F");
  490.      if(strstr(find.name,".MOD"))strcpy(fn,"F");
  491.        }
  492.        fn++;
  493.        *fn=' ';
  494.        fn++;
  495.        strcpy(fn,find.name);
  496.        fn+=14;
  497.       }
  498.      while(!_dos_findnext(&find)){
  499.        if(!(find.attrib & _A_NORMAL))strcpy(fn,"D");
  500.        if(!(find.attrib & _A_SUBDIR)){
  501.      strcpy(fn,"N");
  502.      if(strstr(find.name,".VOC"))strcpy(fn,"F");
  503.      if(strstr(find.name,".WAV"))strcpy(fn,"F");
  504.      if(strstr(find.name,".IFF"))strcpy(fn,"F");
  505.      if(strstr(find.name,".SND"))strcpy(fn,"F");
  506.      if(strstr(find.name,".AIF"))strcpy(fn,"F");
  507.      if(strstr(find.name,".AU"))strcpy(fn,"F");
  508.      if(strstr(find.name,".SAM"))strcpy(fn,"F");
  509.      if(strstr(find.name,".MOD"))strcpy(fn,"F");
  510.        }
  511.        fn++;
  512.        *fn=' ';
  513.        fn++;
  514.        strcpy(fn,find.name);
  515.        fn+=14;
  516.      }
  517.    }
  518.    fn=fnp;
  519.    qsort(fn, num, 16, strcmp);
  520.    return(fnp);
  521. }
  522.  
  523. int show_files(char *fnp,int num)
  524. {
  525.    int j=0;
  526.    int ORIGIN
  527.    char *fn;
  528.  
  529.    fn=fnp;
  530.    fn+=((cur_page-1)*1152);
  531.    print_page();
  532.    print_q();
  533.    print_dv();
  534.    clear_display();
  535.  
  536.    ORIGIN
  537.    j=0;
  538.  
  539.    while((j<72) && (j<display_max)){
  540.      if(x > 20){
  541.        x=3;
  542.        y+=18;
  543.      }
  544.      _settextposition(x,y);
  545.      if(*fn == 'F')_settextcolor(14);
  546.      else if(*fn == 'N')_settextcolor(15);
  547.      else if(*fn == 'D')_settextcolor(11);
  548.      else strcpy(fn,"              ");
  549.  
  550.      fn+=2;
  551.      _outtext(fn);
  552.      x++;
  553.      j++;
  554.      fn+=14;
  555.    }
  556.    return(0);
  557. }
  558.  
  559. int show_cursor(char *fnp, int cp)
  560. {
  561.     int ORIGIN
  562.     int i=0;
  563.     int t=0;
  564.     int len=0;
  565.     char *fn;
  566.     char blank[]="            ";
  567.     char name[]="            ";
  568.  
  569.     if(fnp !=NULL){
  570.      fn=fnp;
  571.      fn+=((cur_page-1)*1152);
  572.      t=old_cp-1;
  573.      strcpy(name,blank);
  574.      fn+=(t*16)+2;
  575.      len=strlen(fn);
  576.      for(i=0;i<len;i++){
  577.       name[i]=fn[i];
  578.      }
  579.  
  580.      if(old_cp <= 18){
  581.        x+=t;
  582.      }
  583.      if((18 < old_cp) && (old_cp <= 36)){
  584.        x+=t-18;
  585.        y+=18;
  586.      }
  587.      if ((36 < old_cp) && (old_cp <= 54)){
  588.        x+=t-36;
  589.        y+=36;
  590.      }
  591.      if ((54 < old_cp) && (old_cp <= 72)){
  592.        x+=t-54;
  593.        y+=54;
  594.      }
  595.      if(Mouse)SetPtrVis(HIDE);
  596.      _settextposition(x,y);
  597.      _setbkcolor(9);
  598.      fn-=2;
  599.      if(*fn == 'F')_settextcolor(14);
  600.      else if(*fn == 'N')_settextcolor(15);
  601.      else if(*fn == 'D')_settextcolor(11);
  602.      else strcpy(name,blank);
  603.      _outtext(name);
  604.  
  605.      ORIGIN
  606.      fn=fnp;
  607.      fn+=((cur_page-1)*1152);
  608.      t=cp-1;
  609.      strcpy(name,blank);
  610.  
  611.      fn+=(t)*16+2;
  612.      len=strlen(fn);
  613.      for(i=0;i<len;i++){
  614.       name[i]=fn[i];
  615.      }
  616.  
  617.      if(cp <= 18){
  618.        x+=t;
  619.      }
  620.      if((18 < cp) && (cp <= 36)){
  621.        x+=t-18;
  622.        y+=18;
  623.      }
  624.      if ((36 < cp) && (cp <= 54)){
  625.        x+=t-36;
  626.        y+=36;
  627.      }
  628.      if ((54 < cp) && (cp <= 72)){
  629.        x+=t-54;
  630.        y+=54;
  631.      }
  632.      if(cp>display_max)strcpy(name,blank);
  633.      _settextposition(x,y);
  634.      _setbkcolor(7);
  635.      _settextcolor(0);
  636.      _outtext(name);
  637.      _settextposition(x,y);
  638.      if(Mouse)SetPtrVis(SHOW);
  639.      return(0);
  640.     }
  641.     else{
  642.      _settextposition(x,y);
  643.      _setbkcolor(7);
  644.      _settextcolor(0);
  645.      _outtext(" No files!  ");
  646.      return(0);
  647.     }
  648. }
  649.  
  650. char *play_it(char * fnp)
  651. {
  652.     int i=0;
  653.     char file_name[13];
  654.     char *fn;
  655.     int file=1;
  656.  
  657.     error=0;
  658.     fn=fnp;
  659.     fn+=((cur_page-1)*1152);
  660.     i=cp-1;
  661.     fn+=i*16 + 2;
  662.     strcpy(file_name,fn);
  663.     _settextposition(23,1);
  664.     _settextcolor(12);
  665.     _setbkcolor(9);
  666.       for(i=0;i<6;i++){
  667.         _outtext("                                       ");
  668.       }
  669.     _settextposition(23,1);
  670.  
  671.     fn-=2;
  672.     if(*fn == 'F')file=1;
  673.     if(*fn == 'N')file=1;
  674.     if(*fn == 'D')file=0;
  675.  
  676.     if(file) error=play_sound(file_name);
  677.  
  678.     if(!file){
  679.       if(strcmp(file_name,".")){
  680.         cp=1;
  681.         old_cp=1;
  682.         cur_page=1;
  683.         old_page=1;
  684.         error=chdir(file_name);
  685.         fnp=new_dir(fnp);
  686.       }
  687.     }
  688.     if(error>0 || (multi_error)){
  689.       time(&p_time);
  690.       time(&c_time);
  691.       while((c_time-p_time) < 2){
  692.        time(&c_time);
  693.       };
  694.     }
  695.     error=0;
  696.     multi_error=0;
  697.     display_menu();
  698.     return(fnp);
  699. }
  700.  
  701. void display_menu(void)
  702. {
  703.     _setbkcolor(9);
  704.     _settextcolor(11);
  705.     _settextposition(23,1);
  706.     _outtext(COMMAND1);
  707.     _outtext(COMMAND2);
  708.     _outtext(COMMAND3);
  709. }
  710.  
  711. int show_page(char *fnp,int num)
  712. {
  713.    int j=0;
  714.    int ORIGIN
  715.    int error=0;
  716.    char *fn;
  717.    char blank[]="            ";
  718.  
  719.    fn=fnp;
  720.    if(Mouse)SetPtrVis(HIDE);
  721.  
  722.    print_page();
  723.  
  724.    if(old_page != cur_page){
  725.     fn+=((cur_page-1)*1152);
  726.     print_page();
  727.  
  728.    while(j<72){
  729.      if(x > 20){
  730.        x=3;
  731.        y+=18;
  732.      }
  733.      _settextposition(x,y);
  734.      _settextcolor(9);
  735.      _setbkcolor(9);
  736.      _outtext(blank);
  737.      x++;
  738.      j++;
  739.    }
  740.  
  741.    ORIGIN
  742.    j=0;
  743.  
  744.    while(j<display_max){
  745.      if(x > 20){
  746.        x=3;
  747.        y+=18;
  748.      }
  749.      _settextposition(x,y);
  750.      if(*fn == 'F')_settextcolor(14);
  751.      if(*fn == 'N')_settextcolor(15);
  752.      if(*fn == 'D')_settextcolor(11);
  753.      fn+=2;
  754.      _outtext(fn);
  755.      x++;
  756.      j++;
  757.      fn+=14;
  758.    }
  759.      old_page=cur_page;
  760.    }
  761.    if(Mouse)SetPtrVis(SHOW);
  762. }
  763.  
  764. char *new_dir(char *fnp)
  765. {
  766.       int error=0;
  767.       char *fn;
  768.  
  769.       cp=1;
  770.       old_cp=1;
  771.       cur_page=1;
  772.       old_page=1;
  773.       if(fnp!=NULL)free(fnp);
  774.  
  775.       if(Mouse)SetPtrVis(HIDE);
  776.       clear_display();
  777.       num=find_files();
  778.       if(num>0){
  779.        remainder=num%72;
  780.        if((num-((cur_page)*72))>0)display_max=72;
  781.        else display_max=remainder;
  782.        if(cp>display_max)cp=display_max;
  783.        fnp=malloc(16*num);
  784.        fn=fnp;
  785.        if(fnp){
  786.     fn=get_files(fnp);
  787.     error=show_files(fnp,num);
  788.     if(Mouse)SetPtrVis(SHOW);
  789.     return(fnp);
  790.        }
  791.        else _outtext("Failure to allocate memory for file names!\n");
  792.       }
  793.       return(NULL);
  794. }
  795.  
  796. char *update_dir(char *fnp)
  797. {
  798.       int error=0;
  799.       char *fn;
  800.  
  801.       if(fnp!=NULL)free(fnp);
  802.  
  803.       if(Mouse)SetPtrVis(HIDE);
  804.       clear_display();
  805.       num=find_files();
  806.       if(num>0){
  807.        remainder=num%72;
  808.        if((num-((cur_page)*72))>0)display_max=72;
  809.        else display_max=remainder;
  810.        fnp=malloc(16*num);
  811.        fn=fnp;
  812.        if(fnp){
  813.     fn=get_files(fnp);
  814.     error=show_files(fnp,num);
  815.     if(Mouse)SetPtrVis(SHOW);
  816.     return(fnp);
  817.        }
  818.        else _outtext("Failure to allocate memory for file names!\n");
  819.       }
  820.       return(NULL);
  821. }
  822.  
  823. void display_intro(void)
  824. {
  825.     _settextposition(3,6);
  826.     _setbkcolor(9);
  827.     _settextcolor(11);
  828.     _outtext(PROGRAM);
  829.     _outtext(PURPOSE);
  830.     _settextposition(5,6);
  831.     _outtext("Plays .WAV, .VOC, .SND, .IFF, .AIF, .SAM, & .MOD Sound Files");
  832.     _settextposition(6,6);
  833.     _outtext("on ");
  834.     _outtext(CARD);
  835.     _outtext(" and the PC speaker.");
  836.     _settextposition(16,9);
  837.     _outtext(OWNER);
  838.     _settextposition(18,25);
  839.     _outtext(SERIAL);
  840.     _settextposition(20,9);
  841.     _outtext(COPYRIGHT);
  842. }
  843.  
  844. void display_help(void)
  845. {
  846.     int x1=5,x2=15;
  847.     int y1=25,y2=55;
  848.     int i=0;
  849.     int attr=15;
  850.     int box_type=1;
  851.     struct rccoord oldpos;
  852.  
  853.     oldpos=_gettextposition();
  854.     if(Mouse)SetPtrVis(HIDE);
  855.     screen=save_screen(x1, y1, x2, y2);
  856.     draw_box(box_type, x1, y1, x2, y2, attr);
  857.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  858.     _outtext(HELP1);
  859.     _outtext(HELP5);
  860.     _outtext(HELP6);
  861.     _outtext(HELP7);
  862.     while( _bios_keybrd(_KEYBRD_READY ) )
  863.     _bios_keybrd(_KEYBRD_READ);
  864.     i = _bios_keybrd(_KEYBRD_READ );
  865.     restore_screen(screen, x1, y1, x2, y2);
  866.     _settextwindow(1,1,25,80);
  867.     _settextposition(oldpos.row, oldpos.col);
  868.     if(Mouse)SetPtrVis(SHOW);
  869. }
  870.  
  871. void clear_display(void)
  872. {
  873.    int j=0;
  874.    int ORIGIN
  875.    char blank[]="                  ";
  876.  
  877.    while(j<72){
  878.      if(x > 20){
  879.        x=3;
  880.        y+=18;
  881.      }
  882.      _settextposition(x,y);
  883.      _settextcolor(9);
  884.      _setbkcolor(9);
  885.      _outtext(blank);
  886.      x++;
  887.      j++;
  888.    }
  889. }
  890.  
  891. int *save_screen(int x1, int y1, int x2, int y2)
  892. {
  893.     int i=0;
  894.     int j=0;
  895.     int letter;
  896.     int *buffer;
  897.     int *bp;
  898.     int num_words=0;
  899.  
  900.     num_words=((x2-x1+1)*(y2-y1+1));
  901.     buffer=(int *)malloc(num_words*sizeof(int));
  902.     bp=buffer;
  903.      for(i=x1;i<=x2;i++){
  904.       for(j=y1;j<=y2;j++){
  905.        *bp=get_char(i,j,0);
  906.        bp++;
  907.       }
  908.      }
  909.     return(buffer);
  910. }
  911.  
  912. int restore_screen(int *screen, int x1, int y1, int x2, int y2)
  913. {
  914.     int i=0;
  915.     int j=0;
  916.     int *buffer;
  917.  
  918.     buffer=screen;
  919.  
  920.     for(i=x1;i<=x2;i++){
  921.       for(j=y1;j<=y2;j++){
  922.        put_char(*buffer,i,j,0);
  923.        buffer++;
  924.       }
  925.      }
  926.      free(screen);
  927. }
  928.  
  929. int get_char(int x, int y,int page)
  930. {
  931.     x--;
  932.     y--;
  933.     _asm{
  934.         mov ah,2
  935.         mov dh,x
  936.         mov dl,y
  937.         mov bh,page
  938.         int 10h
  939.         mov ah,8
  940.         mov bh,page
  941.         int 10h
  942.     }
  943. }
  944.  
  945. void put_char(int Char, int x, int y, int page)
  946. {
  947.  
  948.     x--;
  949.     y--;
  950.     _asm{
  951.         mov ah,2
  952.         mov dh,x
  953.         mov dl,y
  954.         mov bh,0
  955.         int 10h
  956.         mov ax,Char
  957.         mov bl,ah
  958.         mov ah,9
  959.         mov cx,1
  960.         int 10h
  961.     }
  962. }
  963.  
  964. void draw_box(int type, int x1, int y1, int x2, int y2, int attr)
  965. {
  966.     int i=0;
  967.     int j=0;
  968.     type=type*2;
  969.  
  970.     if(Mouse)SetPtrVis(HIDE);
  971.     _setbkcolor(attr);
  972.       _settextposition(x1,y1);
  973.       _outtext(&ulc[type]);
  974.       for(i=y1+1;i<y2;i++){
  975.        _outtext(&hl[type]);
  976.       }
  977.       _outtext(&urc[type]);
  978.       for(i=x1+1;i<x2;i++){
  979.        _settextposition(i,y1);
  980.        _outtext(&vl[type]);
  981.        for(j=y1+1;j<y2;j++){
  982.         _outtext(" ");
  983.        }
  984.        _outtext(&vl[type]);
  985.       }
  986.       _settextposition(x2,y1);
  987.       _outtext(&llc[type]);
  988.       for(i=y1+1;i<y2;i++){
  989.        _outtext(&hl[type]);
  990.       }
  991.       _outtext(&lrc[type]);
  992.       if(Mouse)SetPtrVis(SHOW);
  993. }
  994.  
  995. void set_defaults(void)
  996. {
  997.     int x1=4,x2=20;
  998.     int y1=22,y2=52;
  999.     int attr=15;
  1000.     int box_type=1;
  1001.     int key=0;
  1002.     struct rccoord oldpos;
  1003.  
  1004.     if(Mouse)SetPtrVis(HIDE);
  1005.     oldpos=_gettextposition();
  1006.     screen=save_screen(x1, y1, x2, y2);
  1007.     draw_box(box_type, x1, y1, x2, y2, attr);
  1008.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1009.     _settextposition(7,0);
  1010.     _outtext(" # signed data\n");
  1011.     _outtext(" % unsigned data\n");
  1012.     _outtext(" R change playback rate\n");
  1013.     _outtext(" ! amplify sound samples\n");
  1014.     _outtext(" & silence sound samples\n");
  1015.     _outtext(" N normal samples\n");
  1016.     _outtext(" V change playback volume\n");
  1017.     _outtext(" S save defaults\n");
  1018.     _outtext(" ESC to return");
  1019.  
  1020.     while(key!=ESC){
  1021.      _settextposition(0,0);
  1022.      _outtext("Type is ");
  1023.      if(default_bits < 0)_outtext("8 Bit Signed Data  \n");
  1024.      else _outtext("8 Bit Unsigned Data\n");
  1025.      _outtext("Playback rate is ");
  1026.      print_number(play_rate);
  1027.      _outtext(" hz  ");
  1028.      _outtext("\n\n");
  1029.      if(magnitude==1)_outtext("Amplify Samples \n");
  1030.      if(magnitude==0)_outtext("Normal Samples  \n");
  1031.      if(magnitude==-1)_outtext("Decrease Samples\n");
  1032.      _outtext("Sound volume is ");
  1033.      print_number(volume);
  1034.      _outtext("   ");
  1035.     key=get_key();
  1036.     switch (key){
  1037.        case 'R':
  1038.        case 'r':
  1039.          _settextwindow(1,1,25,80);
  1040.          get_rate();
  1041.          _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1042.          break;
  1043.        case '!':
  1044.          magnitude=1;
  1045.          break;
  1046.        case 'N':
  1047.        case 'n':
  1048.          magnitude=0;
  1049.          break;
  1050.        case '&':
  1051.          magnitude=-1;
  1052.          break;
  1053.        case 'V':
  1054.        case 'v':
  1055.          _settextwindow(1,1,25,80);
  1056.          get_vol();
  1057.          _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1058.          break;
  1059.        case '#':
  1060.          default_bits=-8;
  1061.          break;
  1062.        case '%':
  1063.          default_bits=8;
  1064.          break;
  1065.        case 'S':
  1066.        case 's':
  1067.          _settextwindow(1,1,25,80);
  1068.          save_defaults();
  1069.          _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1070.          break;
  1071.        }
  1072.     }
  1073.     restore_screen(screen, x1, y1, x2, y2);
  1074.     _settextwindow(1,1,25,80);
  1075.     _settextposition(oldpos.row, oldpos.col);
  1076.     if(Mouse)SetPtrVis(SHOW);
  1077. }
  1078.  
  1079. void get_rate(void)
  1080. {
  1081.     int x1=15,x2=17;
  1082.     int y1=25,y2=50;
  1083.     int attr=15;
  1084.     int box_type=2;
  1085.     unsigned rate=0;
  1086.     int *screen;
  1087.     int ok=0;
  1088.     short row1,row2;
  1089.     short col1,col2;
  1090.     struct rccoord oldpos;
  1091.  
  1092.     oldpos=_gettextposition();
  1093.     _gettextwindow(&row1,&col1,&row2,&col2);
  1094.     screen=save_screen(x1, y1, x2, y2);
  1095.     draw_box(box_type, x1, y1, x2, y2, attr);
  1096.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1097.     _outtext(" Play back Rate? ");
  1098.     _settextcursor(0x707);
  1099.     rate=input_number(1,18);
  1100.     _settextcursor(0x2000);
  1101.     if((rate > 4000) && (rate < 45000))play_rate=rate;
  1102.     restore_screen(screen, x1, y1, x2, y2);
  1103.     _settextwindow(row1,col1,row2,col2);
  1104.     _settextposition(oldpos.row, oldpos.col);
  1105. }
  1106.  
  1107. int save_defaults(void)
  1108. {
  1109.     int x1=15,x2=17;
  1110.     int y1=15,y2=70;
  1111.     int attr=15;
  1112.     int box_type=2;
  1113.     int *screen;
  1114.     short row1,row2;
  1115.     short col1,col2;
  1116.     struct rccoord oldpos;
  1117.     int ini_handle=0;
  1118.     int length=0;
  1119.     char *file_buffer;
  1120.     char *owner;
  1121.     char *serial;
  1122.     char *path;
  1123.     char *command;
  1124.     char *sound_path;
  1125.     char s_path[_MAX_PATH];
  1126.     char string[80];
  1127.  
  1128.          strcpy(s_path,".");
  1129.          sound_path=getenv("SOUND");
  1130.          if(sound_path!=NULL){
  1131.            strcpy(s_path,sound_path);
  1132.          }
  1133.          strcat(s_path,"\\SBPLAY.INI");
  1134.          ini_handle = open( s_path, O_TEXT | O_RDWR | O_CREAT | O_TRUNC,
  1135.           S_IREAD | S_IWRITE);
  1136.          if(ini_handle== -1)return(0);
  1137.          else{
  1138.            file_buffer=malloc(2048);
  1139.            if(file_buffer==NULL){
  1140.          printf("Could not allocate buffer for .ini file\n");
  1141.          return(10);
  1142.            }
  1143.            time(&p_time);
  1144.            oldpos=_gettextposition();
  1145.            _gettextwindow(&row1,&col1,&row2,&col2);
  1146.            screen=save_screen(x1, y1, x2, y2);
  1147.            draw_box(box_type, x1, y1, x2, y2, attr);
  1148.            _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1149.            _outtext("Saving ");
  1150.            _outtext(s_path);
  1151.            time(&c_time);
  1152.            while((c_time-p_time) < 3){
  1153.          time(&c_time);
  1154.            };
  1155.     restore_screen(screen, x1, y1, x2, y2);
  1156.     _settextwindow(row1,col1,row2,col2);
  1157.     _settextposition(oldpos.row, oldpos.col);
  1158.            strcpy(file_buffer,";SBPlay initialization file for setting miscellaneous defaults\n");
  1159.            strcat(file_buffer,"OWNER=\"");
  1160.            strcat(file_buffer,reg_name);
  1161.            strcat(file_buffer,"\"\nREG_NO=\"");
  1162.            strcat(file_buffer,ser_number);
  1163.            strcat(file_buffer,"\"\nDEFAULT_PATH=\"");
  1164.            strcat(file_buffer,default_path);
  1165.            strcat(file_buffer,"\"\nTYPE=\"");
  1166.            if(default_bits<0)strcat(file_buffer,"SIGNED");
  1167.            else strcat(file_buffer,"UNSIGNED");
  1168.            strcat(file_buffer,"\"\nRATE=\"");
  1169.            itoa(play_rate,string,10);
  1170.            strcat(file_buffer,string);
  1171.            strcat(file_buffer,"\"\nVOLUME=\"");
  1172.            itoa(volume,string,10);
  1173.            strcat(file_buffer,string);
  1174.            strcat(file_buffer,"\"\nAMPLIFY=\"");
  1175.            if(magnitude==1)strcat(file_buffer,"PLUS");
  1176.            if(magnitude==0)strcat(file_buffer,"NONE");
  1177.            if(magnitude==-1)strcat(file_buffer,"MINUS");
  1178.            strcat(file_buffer,"\"\n");
  1179.            length=strlen(file_buffer);
  1180.            write(ini_handle,file_buffer,length);
  1181.            close(ini_handle);
  1182.          }
  1183.  
  1184. }
  1185.  
  1186. void _interrupt _cdecl _far brk_handler()
  1187. {
  1188.     return;
  1189. }
  1190.  
  1191. void print_page(void)
  1192. {
  1193.     char page[40];
  1194.     char num[8];
  1195.     page[0]=0;
  1196.  
  1197.     _settextposition(1,6);
  1198.     _setbkcolor(9);
  1199.     _settextcolor(15);
  1200.     strcat(page,"[ Page ");
  1201.     itoa(cur_page,num,10);
  1202.     strcat(page,num);
  1203.     strcat(page," of ");
  1204.     itoa(pages,num,10);
  1205.     strcat(page,num);
  1206.     strcat(page," ]");
  1207.     _outtext(page);
  1208.  
  1209.        if(cur_page > 1){
  1210.      _settextcolor(11);
  1211.      _settextposition(22,70);
  1212.      _outtext(UA);
  1213.        }
  1214.        else{
  1215.      _settextcolor(15);
  1216.      _settextposition(22,70);
  1217.      _outtext(LINE);
  1218.        }
  1219.        if(cur_page < pages){
  1220.      _settextcolor(11);
  1221.      _settextposition(22,74);
  1222.      _outtext(DA);
  1223.        }
  1224.        else{
  1225.      _settextcolor(15);
  1226.      _settextposition(22,74);
  1227.      _outtext(LINE);
  1228.        }
  1229.  
  1230. }
  1231.  
  1232. void print_q(void)
  1233. {
  1234.     _setbkcolor(9);
  1235.     _settextcolor(15);
  1236.     _settextposition(1,60);
  1237.     _outtext("[ ? Help ]");
  1238. }
  1239.  
  1240. void print_dv(void)
  1241. {
  1242.     if(in_dv){
  1243.      _setbkcolor(9);
  1244.      _settextcolor(15);
  1245.      _settextposition(1,36);
  1246.      _outtext("[ DESQview ]");
  1247.     }
  1248. }
  1249.  
  1250. void print_number(unsigned number)
  1251. {
  1252.      char num[8];
  1253.  
  1254.      ultoa((long)number,num,10);
  1255.      _outtext(num);
  1256. }
  1257.  
  1258. unsigned input_number(int row,int col)
  1259. {
  1260.     char numstring[20];
  1261.     int key;
  1262.     char c;
  1263.     int i=0;
  1264.     int number=0;
  1265.  
  1266.     while((key=get_key()) != CR && key != ESC && i < 6)
  1267.     {
  1268.      if(key >= '0' && key <= '9'){
  1269.        c=(char)(key);
  1270.        numstring[i]=key;
  1271.        _outmem(&c,1);
  1272.        i++;
  1273.      }
  1274.      if(key == LFAR){
  1275.        i--;
  1276.        if(i<0)i=0;
  1277.        _settextposition(row,col+i);
  1278.      }
  1279.      if(key == BS){
  1280.        i--;
  1281.        if(i<0)i=0;
  1282.        _settextposition(row,col+i);
  1283.        _outmem(" ",1);
  1284.        _settextposition(row,col+i);
  1285.      }
  1286.     }
  1287.     numstring[i]=0;
  1288.     number=(unsigned)atol(numstring);
  1289.     if(key == ESC)number=0;
  1290.     return(number);
  1291. }
  1292.  
  1293. int get_key(void)
  1294. {
  1295.     int key=0;
  1296.     int me=0;
  1297.     int scancode=0;
  1298.  
  1299.     while(!(me || key)){
  1300.     give_cpu();
  1301.     me=mouse_event();
  1302.     key=_bios_keybrd(_KEYBRD_READY );
  1303.     }
  1304.     if(key){
  1305.      key = _bios_keybrd(_KEYBRD_READ );
  1306.      scancode=((key & 0xff00) >> 8);
  1307.      key=(key & 0x00ff);
  1308.      if(key==0)key=scancode+256;
  1309.     }
  1310.     if(me)return(me);
  1311.     else return(key);
  1312. }
  1313.  
  1314. void _far error_handler(unsigned deverror, unsigned errcode, unsigned _far *devhdr)
  1315. {
  1316.     int *screen;
  1317.     int x1=8,x2=14;
  1318.     int y1=25,y2=50;
  1319.     int attr=15;
  1320.     int box_type=1;
  1321.     int key=0;
  1322.     long oldbgd;
  1323.     short oldfgd;
  1324.     short oldx1, oldy1, oldx2, oldy2;
  1325.     struct rccoord oldpos;
  1326.  
  1327.     disk_errors++;
  1328.  
  1329.     if(disk_errors > 3){
  1330.  
  1331.     oldpos=_gettextposition();
  1332.     oldfgd = _gettextcolor();
  1333.     oldbgd = _getbkcolor();
  1334.     screen=save_screen(x1, y1, x2, y2);
  1335.     _settextcolor(12);
  1336.     _setbkcolor(9);
  1337.     _gettextwindow(&oldx1,&oldy1,&oldx2,&oldy2);
  1338.     _settextwindow(1,1,25,80);
  1339.     draw_box(box_type, x1, y1, x2, y2, attr);
  1340.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1341.     _settextposition(1,2);
  1342.     _outtext(errors[errcode]);
  1343.     _settextposition(3,1);
  1344.     _outtext(" (I)gnore the error\n");
  1345.     _outtext(" (R)etry the operation\n");
  1346.     _outtext(" (A)bort the program");
  1347.  
  1348.     key=get_key();
  1349.  
  1350.     restore_screen(screen, x1, y1, x2, y2);
  1351.     _settextcolor(oldfgd);
  1352.     _setbkcolor(oldbgd);
  1353.     _settextwindow(oldx1,oldy1,oldx2,oldy2);
  1354.     _settextposition(oldpos.row, oldpos.col);
  1355.  
  1356.     switch (key){
  1357.        case 'I':
  1358.        case 'i':
  1359.          _hardresume(_HARDERR_IGNORE);
  1360.          break;
  1361.        case 'R':
  1362.        case 'r':
  1363.          _hardresume(_HARDERR_RETRY);
  1364.          break;
  1365.        case 'A':
  1366.        case 'a':
  1367.          _hardresume(_HARDERR_ABORT);
  1368.          break;
  1369.        default:
  1370.          _hardresume(_HARDERR_RETRY);
  1371.          break;
  1372.        }
  1373.     }
  1374.     else{
  1375.       _hardresume(_HARDERR_RETRY);
  1376.     }
  1377. }
  1378.  
  1379. void change_drive(void)
  1380. {
  1381.     int *screen;
  1382.     int x1=8,x2=12;
  1383.     int y1=30,y2=50;
  1384.     int attr=15;
  1385.     int box_type=1;
  1386.     int key=0;
  1387.     char d;
  1388.     long oldbgd;
  1389.     short oldfgd;
  1390.     struct rccoord oldpos;
  1391.     int num_diskette=0;
  1392.     int drives=0;
  1393.     int drivenumber=3;
  1394.     int i=0;
  1395.     int cur_drive=3;
  1396.     int num_drives=0;
  1397.  
  1398.     if(Mouse)SetPtrVis(HIDE);
  1399.     oldpos=_gettextposition();
  1400.     oldfgd = _gettextcolor();
  1401.     oldbgd = _getbkcolor();
  1402.     screen=save_screen(x1, y1, x2, y2);
  1403.     _settextcolor(0);
  1404.     _setbkcolor(7);
  1405.     draw_box(box_type, x1, y1, x2, y2, attr);
  1406.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1407.     _settextposition(1,2);
  1408.     _outtext("Select Drive: \n\n");
  1409.     _asm{
  1410.       int 11h
  1411.       test ax,1
  1412.       jz none
  1413.       and ax,0x00c0
  1414.       mov cl,6
  1415.       shr ax,cl
  1416.       inc ax
  1417.       mov num_diskette,ax
  1418.     none:
  1419.     again:
  1420.      push ds
  1421.      mov ah,1ch
  1422.      mov dl,drivenumber
  1423.      int 21h
  1424.      pop ds
  1425.      cmp al,0ffh
  1426.      je done
  1427.      inc drives
  1428.      inc drivenumber
  1429.      jmp short again
  1430.     done:
  1431.     }
  1432.     if(num_diskette > 0)_outtext(" A ");
  1433.     if(num_diskette > 1)_outtext("B ");
  1434.     for(i=0;i < drives;i++){
  1435.      d='C'+i;
  1436.      _outmem(&d,1);
  1437.      _outtext(" ");
  1438.     }
  1439.     _dos_getdrive(&cur_drive);
  1440.     if(old_drive<0)old_drive=cur_drive;
  1441.     key=get_key();
  1442.     if(key >= 'a' && key <= 'z'){
  1443.       cur_drive=key-'a'+1;
  1444.       _dos_setdrive(cur_drive,&num_drives);
  1445.     }
  1446.     if(key >= 'A' && key <= 'Z'){
  1447.       cur_drive=key-'A'+1;
  1448.       _dos_setdrive(cur_drive,&num_drives);
  1449.     }
  1450.     restore_screen(screen, x1, y1, x2, y2);
  1451.     _settextcolor(oldfgd);
  1452.     _setbkcolor(oldbgd);
  1453.     _settextwindow(1,1,25,80);
  1454.     _settextposition(oldpos.row, oldpos.col);
  1455.     if(Mouse)SetPtrVis(SHOW);
  1456. }
  1457.  
  1458. void get_vol(void)
  1459. {
  1460.     int x1=15,x2=17;
  1461.     int y1=25,y2=45;
  1462.     int attr=15;
  1463.     int box_type=2;
  1464.     unsigned vol=0;
  1465.     int *screen;
  1466.     int ok=0;
  1467.     short row1,row2;
  1468.     short col1,col2;
  1469.     struct rccoord oldpos;
  1470.  
  1471.     oldpos=_gettextposition();
  1472.     _gettextwindow(&row1,&col1,&row2,&col2);
  1473.     screen=save_screen(x1, y1, x2, y2);
  1474.     draw_box(box_type, x1, y1, x2, y2, attr);
  1475.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1476.     _outtext(" New Volume? ");
  1477.     _settextcursor(0x707);
  1478.     vol=input_number(1,18);
  1479.     _settextcursor(0x2000);
  1480.     if((vol >= MINVOLUME) && (vol <= MAXVOLUME))volume=vol;
  1481.     restore_screen(screen, x1, y1, x2, y2);
  1482.     _settextwindow(row1,col1,row2,col2);
  1483.     _settextposition(oldpos.row, oldpos.col);
  1484. }
  1485.  
  1486. int display_exit(void)
  1487. {
  1488.     int key=0;
  1489.     int x1=15,x2=17;
  1490.     int y1=25,y2=45;
  1491.     int attr=15;
  1492.     int box_type=2;
  1493.     unsigned vol=0;
  1494.     int *screen;
  1495.     int ok=0;
  1496.     short row1,row2;
  1497.     short col1,col2;
  1498.     struct rccoord oldpos;
  1499.  
  1500.     oldpos=_gettextposition();
  1501.     _gettextwindow(&row1,&col1,&row2,&col2);
  1502.     screen=save_screen(x1, y1, x2, y2);
  1503.     draw_box(box_type, x1, y1, x2, y2, attr);
  1504.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  1505.     _outtext(" Exit (y/N)? ");
  1506.     key=get_key();
  1507.     if(key == 'y' || key == 'Y')key=ESC;
  1508.     else key='N';
  1509.     _settextcursor(0x707);
  1510.     _settextcursor(0x2000);
  1511.     restore_screen(screen, x1, y1, x2, y2);
  1512.     _settextwindow(row1,col1,row2,col2);
  1513.     _settextposition(oldpos.row, oldpos.col);
  1514.     return(key);
  1515. }
  1516.  
  1517. int mouse_event(void){
  1518.  
  1519.     EVENT mevent;
  1520.     int key=0;
  1521.     int x,y;
  1522.     int pre_cp=1;
  1523.     int file=0;
  1524.  
  1525.     pre_cp=cp;
  1526.  
  1527.      if(Mouse){
  1528.     while(GetMouseEvent(&mevent)){
  1529.      x=mevent.x;
  1530.      y=mevent.y;
  1531.      if(mevent.fsBtn & LEFT_DOWN){
  1532.        switch(y){
  1533.          case 1:
  1534.            if((x >= 60) && (x <=  69))key=63;
  1535.            break;
  1536.          case 3:
  1537.            file=1;
  1538.            if((x >= 6) && (x <=  17))cp=1;
  1539.            else if((x >= 24) && (x <=  35))cp=19;
  1540.            else if((x >= 42) && (x <=  53))cp=37;
  1541.            else if((x >= 60) && (x <=  71))cp=55;
  1542.            else file=0;
  1543.            break;
  1544.          case 4:
  1545.            file=1;
  1546.            if((x >= 6) && (x <=  17))cp=2;
  1547.            else if((x >= 24) && (x <=  35))cp=20;
  1548.            else if((x >= 42) && (x <=  53))cp=38;
  1549.            else if((x >= 60) && (x <=  71))cp=56;
  1550.            else file=0;
  1551.            break;
  1552.          case 5:
  1553.            file=1;
  1554.            if((x >= 6) && (x <=  17))cp=3;
  1555.            else if((x >= 24) && (x <=  35))cp=21;
  1556.            else if((x >= 42) && (x <=  53))cp=39;
  1557.            else if((x >= 60) && (x <=  71))cp=57;
  1558.            else file=0;
  1559.            break;
  1560.          case 6:
  1561.            file=1;
  1562.            if((x >= 6) && (x <=  17))cp=4;
  1563.            else if((x >= 24) && (x <=  35))cp=22;
  1564.            else if((x >= 42) && (x <=  53))cp=40;
  1565.            else if((x >= 60) && (x <=  71))cp=58;
  1566.            else file=0;
  1567.            break;
  1568.          case 7:
  1569.            file=1;
  1570.            if((x >= 6) && (x <=  17))cp=5;
  1571.            else if((x >= 24) && (x <=  35))cp=23;
  1572.            else if((x >= 42) && (x <=  53))cp=41;
  1573.            else if((x >= 60) && (x <=  71))cp=59;
  1574.            else file=0;
  1575.            break;
  1576.          case 8:
  1577.            file=1;
  1578.            if((x >= 6) && (x <=  17))cp=6;
  1579.            else if((x >= 24) && (x <=  35))cp=24;
  1580.            else if((x >= 42) && (x <=  53))cp=42;
  1581.            else if((x >= 60) && (x <=  71))cp=60;
  1582.            else file=0;
  1583.            break;
  1584.          case 9:
  1585.            file=1;
  1586.            if((x >= 6) && (x <=  17))cp=7;
  1587.            else if((x >= 24) && (x <=  35))cp=25;
  1588.            else if((x >= 42) && (x <=  53))cp=43;
  1589.            else if((x >= 60) && (x <=  71))cp=61;
  1590.            else file=0;
  1591.            break;
  1592.          case 10:
  1593.            file=1;
  1594.            if((x >= 6) && (x <=  17))cp=8;
  1595.            else if((x >= 24) && (x <=  35))cp=26;
  1596.            else if((x >= 42) && (x <=  53))cp=44;
  1597.            else if((x >= 60) && (x <=  71))cp=62;
  1598.            else file=0;
  1599.            break;
  1600.          case 11:
  1601.            file=1;
  1602.            if((x >= 6) && (x <=  17))cp=9;
  1603.            else if((x >= 24) && (x <=  35))cp=27;
  1604.            else if((x >= 42) && (x <=  53))cp=45;
  1605.            else if((x >= 60) && (x <=  71))cp=63;
  1606.            else file=0;
  1607.            break;
  1608.          case 12:
  1609.            file=1;
  1610.            if((x >= 6) && (x <=  17))cp=10;
  1611.            else if((x >= 24) && (x <=  35))cp=28;
  1612.            else if((x >= 42) && (x <=  53))cp=46;
  1613.            else if((x >= 60) && (x <=  71))cp=64;
  1614.            else file=0;
  1615.            break;
  1616.          case 13:
  1617.            file=1;
  1618.            if((x >= 6) && (x <=  17))cp=11;
  1619.            else if((x >= 24) && (x <=  35))cp=29;
  1620.            else if((x >= 42) && (x <=  53))cp=47;
  1621.            else if((x >= 60) && (x <=  71))cp=65;
  1622.            else file=0;
  1623.            break;
  1624.          case 14:
  1625.            file=1;
  1626.            if((x >= 6) && (x <=  17))cp=12;
  1627.            else if((x >= 24) && (x <=  35))cp=30;
  1628.            else if((x >= 42) && (x <=  53))cp=48;
  1629.            else if((x >= 60) && (x <=  71))cp=66;
  1630.            else file=0;
  1631.            break;
  1632.          case 15:
  1633.            file=1;
  1634.            if((x >= 6) && (x <=  17))cp=13;
  1635.            else if((x >= 24) && (x <=  35))cp=31;
  1636.            else if((x >= 42) && (x <=  53))cp=49;
  1637.            else if((x >= 60) && (x <=  71))cp=67;
  1638.            else file=0;
  1639.            break;
  1640.          case 16:
  1641.            file=1;
  1642.            if((x >= 6) && (x <=  17))cp=14;
  1643.            else if((x >= 24) && (x <=  35))cp=32;
  1644.            else if((x >= 42) && (x <=  53))cp=50;
  1645.            else if((x >= 60) && (x <=  71))cp=68;
  1646.            else file=0;
  1647.            break;
  1648.          case 17:
  1649.            file=1;
  1650.            if((x >= 6) && (x <=  17))cp=15;
  1651.            else if((x >= 24) && (x <=  35))cp=33;
  1652.            else if((x >= 42) && (x <=  53))cp=51;
  1653.            else if((x >= 60) && (x <=  71))cp=69;
  1654.            else file=0;
  1655.            break;
  1656.          case 18:
  1657.            file=1;
  1658.            if((x >= 6) && (x <=  17))cp=16;
  1659.            else if((x >= 24) && (x <=  35))cp=34;
  1660.            else if((x >= 42) && (x <=  53))cp=52;
  1661.            else if((x >= 60) && (x <=  71))cp=70;
  1662.            else file=0;
  1663.            break;
  1664.          case 19:
  1665.            file=1;
  1666.            if((x >= 6) && (x <=  17))cp=17;
  1667.            else if((x >= 24) && (x <=  35))cp=35;
  1668.            else if((x >= 42) && (x <=  53))cp=53;
  1669.            else if((x >= 60) && (x <=  71))cp=71;
  1670.            else file=0;
  1671.            break;
  1672.          case 20:
  1673.            file=1;
  1674.            if((x >= 6) && (x <=  17))cp=18;
  1675.            else if((x >= 24) && (x <=  35))cp=36;
  1676.            else if((x >= 42) && (x <=  53))cp=54;
  1677.            else if((x >= 60) && (x <=  71))cp=72;
  1678.            else file=0;
  1679.            break;
  1680.          case 21:
  1681.            break;
  1682.          case 22:
  1683.            if((x >= 74) && (x <=  76))key=PGDN;
  1684.            else if((x >= 70) && (x <=  72))key=PGUP;
  1685.            break;
  1686.          case 23:
  1687.            if((x >= 2) && (x <=  20))key=CR;
  1688.            else if((x >= 23) && (x <=  40))key=F1;
  1689.            else if((x >= 43) && (x <=  60))key=F2;
  1690.            else if((x >= 63) && (x <=  79))key=F3;
  1691.            break;
  1692.          case 24:
  1693.            if((x >= 2) && (x <=  20))key=F4;
  1694.            else if((x >= 23) && (x <=  40))key=F5;
  1695.            else if((x >= 43) && (x <=  60))key=F6;
  1696.            else if((x >= 63) && (x <=  79))key=F7;
  1697.            break;
  1698.          case 25:
  1699.            if((x >= 2) && (x <=  20))key=F8;
  1700.            else if((x >= 23) && (x <=  40))key=F9;
  1701.            else if((x >= 43) && (x <=  60))key=F10;
  1702.            else if((x >= 63) && (x <=  79))key=ESC;
  1703.            break;
  1704.          default:
  1705.            break;
  1706.        }
  1707.        if(cp>display_max){
  1708.          cp-=1;
  1709.          key=0;
  1710.        }
  1711.        else if (file){
  1712.          show_cursor(fnp,cp);
  1713.          old_cp=cp;
  1714.          key=CR;
  1715.        }
  1716.      }
  1717.     }
  1718.       }
  1719.     return(key);
  1720. }
  1721.  
  1722. void give_cpu(void)
  1723. {
  1724.     if(in_dv)
  1725.     _asm{
  1726.      MOV AX,1000H            ;Give time slice back to DESQview
  1727.      INT 15H
  1728.      }
  1729.     else
  1730.     _asm{
  1731.      INT 28H                 ;MS-DOS idle handler
  1732.      MOV AX,1680H
  1733.      INT 2FH                 ;MS-DOS idle call
  1734.     }
  1735. }
  1736.  
  1737. int delete(char *fnp)
  1738. {
  1739.     int i=0;
  1740.     char file_name[13];
  1741.     char *fn;
  1742.     char key;
  1743.     int file=1;
  1744.  
  1745.     error=0;
  1746.     fn=fnp;
  1747.     fn+=((cur_page-1)*1152);
  1748.     i=cp-1;
  1749.     fn+=i*16 + 2;
  1750.     strcpy(file_name,fn);
  1751.     _settextposition(23,1);
  1752.     _settextcolor(14);
  1753.     _setbkcolor(9);
  1754.       for(i=0;i<6;i++){
  1755.         _outtext("                                       ");
  1756.       }
  1757.     _settextposition(24,1);
  1758.  
  1759.     fn-=2;
  1760.     if(*fn == 'F')file=1;
  1761.     if(*fn == 'N')file=1;
  1762.     if(*fn == 'D')file=0;
  1763.     if(file){
  1764.       printf( "Do you want to delete %s (N/y)? ",file_name);
  1765.       key = getch();
  1766.       if( (key == 'y') || (key == 'Y') )
  1767.          error=remove(file_name);
  1768.       if(error!=0){
  1769.         _settextposition(23,1);
  1770.         time(&p_time);
  1771.         for(i=0;i<6;i++){
  1772.           _outtext("                                       ");
  1773.         }
  1774.         _settextposition(24,1);
  1775. /*            printf("File error %u",errno); */
  1776.         perror(fmsg);
  1777.         time(&c_time);
  1778.         while((c_time-p_time) < 2){
  1779.           time(&c_time);
  1780.         };
  1781.       }
  1782.     }
  1783.     display_menu();
  1784.     if(cp>=display_max){
  1785.       if(cp>=(num-((cur_page-1)*72)))cp-=1;
  1786.       if(cp<1)cp=1;
  1787.     }
  1788.     return(error);
  1789. }
  1790.  
  1791. int ren_file(char *fnp)
  1792. {
  1793.     int i=0;
  1794.     char file_name[13];
  1795.     char new_file_name[13];
  1796.     char *fn;
  1797.     char key;
  1798.     int file=1;
  1799.  
  1800.     error=0;
  1801.     fn=fnp;
  1802.     fn+=((cur_page-1)*1152);
  1803.     i=cp-1;
  1804.     fn+=i*16 + 2;
  1805.     strcpy(file_name,fn);
  1806.     _settextposition(23,1);
  1807.     _settextcolor(14);
  1808.     _setbkcolor(9);
  1809.       for(i=0;i<6;i++){
  1810.         _outtext("                                       ");
  1811.       }
  1812.     _settextposition(24,1);
  1813.  
  1814.     fn-=2;
  1815.     if(*fn == 'F')file=1;
  1816.     if(*fn == 'N')file=1;
  1817.     if(*fn == 'D')file=0;
  1818.     if(file){
  1819.       printf( "Do you want to rename %s (N/y)? ",file_name);
  1820.       key = getch();
  1821.       _settextposition(23,1);
  1822.       if( (key == 'y') || (key == 'Y') )
  1823.       {
  1824.         for(i=0;i<6;i++){
  1825.           _outtext("                                       ");
  1826.         }
  1827.        _settextposition(23,1);
  1828.        printf("\nPlease enter file name to use: ");
  1829.        gets(new_file_name);
  1830.        if(new_file_name != NULL){
  1831.          strupr(new_file_name);
  1832.          error=rename(file_name,new_file_name);
  1833.        }
  1834.        if(error!=0){
  1835.          time(&p_time);
  1836.          _settextposition(23,1);
  1837.          for(i=0;i<6;i++){
  1838.            _outtext("                                       ");
  1839.          }
  1840.          _settextposition(24,1);
  1841. /*             printf("File error %u",errno); */
  1842.          perror(fmsg);
  1843.          time(&c_time);
  1844.          while((c_time-p_time) < 2){
  1845.           time(&c_time);
  1846.          };
  1847.        }
  1848.       }
  1849.      }
  1850.     display_menu();
  1851.     return(error);
  1852. }
  1853.  
  1854. int copyfile(char *fnp)
  1855. {
  1856.     int key=0;
  1857.     int i=0;
  1858.     char *fn;
  1859.     char *file_buffer;
  1860.     char src_file[13];
  1861.     char dst_path[100];
  1862.     char fchar;
  1863.     int handle;
  1864.     int source_handle;
  1865.     long length=0;
  1866.     long number_read=0;
  1867.     int j,k,m;
  1868.  
  1869.     fn=fnp;
  1870.     fn+=((cur_page-1)*1152);
  1871.     i=cp-1;
  1872.     fn+=i*16 + 2;
  1873.  
  1874.     strcpy(src_file,fn);
  1875.  
  1876.     _settextposition(23,1);
  1877.     _settextcolor(14);
  1878.     _setbkcolor(9);
  1879.       for(i=0;i<6;i++){
  1880.         _outtext("                                       ");
  1881.       }
  1882.     _settextposition(24,1);
  1883.  
  1884.     printf("Do you want to copy %s? (N/y)",src_file);
  1885.     key=getch();
  1886.     _settextposition(24,1);
  1887.     _outtext("                                                       ");
  1888.     _settextposition(23,1);
  1889.  
  1890.     switch(key)
  1891.     {
  1892.     case 'Y':
  1893.     case 'y':
  1894.        strcpy(dst_path,get_path());
  1895.        if(dst_path != NULL){
  1896.          strupr(dst_path);
  1897.          strcpy(default_path,dst_path);
  1898.          strcat(dst_path,src_file);
  1899.          source_handle = open( src_file, O_BINARY | O_RDONLY );
  1900.          if(source_handle>0)length=filelength(source_handle);
  1901.          handle = open(dst_path, O_CREAT | O_WRONLY | O_EXCL | O_BINARY,
  1902.                   S_IREAD | S_IWRITE);
  1903.          if(handle == -1){
  1904.          if( errno == EEXIST )
  1905.         {
  1906.          _settextposition(24,1);
  1907.          _outtext("                                                       ");
  1908.          _settextposition(24,1);
  1909.  
  1910.           _outtext("File already exists. Overwrite (N/y)? " );
  1911.           key = getch();
  1912.           if( (key == 'y') || (key == 'Y') )
  1913.           handle = open( dst_path, O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
  1914.                     S_IREAD | S_IWRITE );
  1915.           printf( "\n" );
  1916.         }
  1917.         else{
  1918.          _settextposition(24,1);
  1919.          p_cerror(msg,dst_path);
  1920.          time(&c_time);
  1921.          return(99);
  1922.          }
  1923.         }
  1924.         if( (key == 'y') || (key == 'Y') ){
  1925.          if((file_buffer =(char *)malloc(8192)) == NULL){
  1926.          perror(msg);
  1927.          printf("Malloc could not allocate memory for file buffer.\n");
  1928.          error=1;
  1929.          }
  1930.  
  1931.     j=0;
  1932.     m=0;
  1933.     k=0;
  1934.     number_read=0;
  1935.  
  1936.     _settextposition(23,1);
  1937.     printf("\n                                                      ");
  1938.  
  1939.     do
  1940.     {
  1941.       if(length - number_read > 8192) k=8192;
  1942.        else k=length - number_read;
  1943.       m = read(source_handle,file_buffer,k);
  1944.       j = write(handle,file_buffer,k);
  1945.       if(m!=j){
  1946.         printf("File write problem.\n");
  1947.         error=1;
  1948.       }
  1949.       number_read=number_read + m;
  1950.     } while((number_read < length) && m==k);
  1951.          free(file_buffer);
  1952.          close(handle);
  1953.          close(source_handle);
  1954.        }
  1955.        break;
  1956.     }
  1957.     return(error);
  1958.     }
  1959.     return(0);
  1960. }
  1961.  
  1962. int get_defaults(void)
  1963. {
  1964.     int ini_handle=0;
  1965.     unsigned file_length=0;
  1966.     unsigned num_read=0;
  1967.     char *file_buffer;
  1968.     char *owner;
  1969.     char *serial;
  1970.     char *path;
  1971.     char *command;
  1972.     char *sound_path;
  1973.     char s_path[_MAX_PATH];
  1974.  
  1975.          strcpy(s_path,".");
  1976.          sound_path=getenv("SOUND");
  1977.          if(sound_path!=NULL){
  1978.            strcpy(s_path,sound_path);
  1979.          }
  1980.          strcat(s_path,"\\SBPLAY.INI");
  1981.          ini_handle = open( s_path, O_TEXT | O_RDONLY );
  1982.          if(ini_handle== -1)return(0);
  1983.          else{
  1984.            file_length=(unsigned)filelength(ini_handle);
  1985.            if(file_length > 16384)file_length=16384;
  1986.            file_buffer=malloc(file_length+1);
  1987.            if(file_buffer==NULL){
  1988.          printf("Could not allocate buffer for .ini file\n");
  1989.          return(10);
  1990.            }
  1991.            num_read=read(ini_handle,file_buffer,file_length);
  1992.            file_buffer[num_read]=0;
  1993.  
  1994.            command=strstr(file_buffer,"AMPLIFY=\"");
  1995.            if(command!=NULL){
  1996.          command=get_string(command,9);
  1997.          if(strstr(command,"PLUS"))magnitude=1;
  1998.          if(strstr(command,"MINUS"))magnitude=-1;
  1999.          if(strstr(command,"NONE"))magnitude=0;
  2000.            }
  2001.            command=strstr(file_buffer,"VOLUME=\"");
  2002.            if(command!=NULL){
  2003.          command=get_string(command,8);
  2004.          volume=atoi(command);
  2005.            }
  2006.            command=strstr(file_buffer,"RATE=\"");
  2007.            if(command!=NULL){
  2008.          command=get_string(command,6);
  2009.          play_rate=atoi(command);
  2010.            }
  2011.            command=strstr(file_buffer,"TYPE=\"");
  2012.            if(command!=NULL){
  2013.          command=get_string(command,6);
  2014.          if(strstr(command,"SIGNED"))default_bits=-8;
  2015.          if(strstr(command,"UNSIGNED"))default_bits=8;
  2016.            }
  2017.            path=strstr(file_buffer,"DEFAULT_PATH=\"");
  2018.            if(path!=NULL){
  2019.          path=get_string(path,14);
  2020.          strcpy(default_path,path);
  2021.            }
  2022.            serial=strstr(file_buffer,"REG_NO=\"");
  2023.            if(serial!=NULL){
  2024.          serial=get_string(serial,8);
  2025.          _settextposition(18,38);
  2026.          _outtext(serial);
  2027.          strcpy(ser_number,serial);
  2028.            }
  2029.            owner=strstr(file_buffer,"OWNER=\"");
  2030.            if(owner!=NULL){
  2031.          reg_owner=get_string(owner,7);
  2032.          _settextposition(16,46);
  2033.          _outtext(reg_owner);
  2034.          strcpy(reg_name,reg_owner);
  2035.            }
  2036.            free(file_buffer);
  2037.            close(ini_handle);
  2038.          }
  2039. }
  2040. char *get_string(char *string,int start)
  2041. {
  2042.     int i=0;
  2043.     int found=0;
  2044.     char letter;
  2045.  
  2046.     i=start;
  2047.  
  2048.     do{
  2049.      letter=string[i];
  2050.      if(letter=='"'){
  2051.        found=1;
  2052.        string[i]=0;
  2053.      }
  2054.      i++;
  2055.     }while(!found);
  2056.  
  2057.     return(string+start);
  2058. }
  2059.  
  2060. char *get_path(void)
  2061. {
  2062.     char fchar;
  2063.     char dst_path[_MAX_PATH];
  2064.  
  2065.     printf("\nPlease enter Drive:\Path to use: ");
  2066.     if(strlen(default_path) > 0){
  2067.        printf("%s",default_path);
  2068.        fchar=getch();
  2069.        switch(fchar){
  2070.  
  2071.        case CR:
  2072.           strcpy(dst_path,default_path);
  2073.           break;
  2074.        default:
  2075.          _settextposition(24,1);
  2076.          _outtext("                                                       ");
  2077.          _settextposition(23,1);
  2078.          printf("\nPlease enter Drive:\Path to use: ");
  2079.          gets(dst_path);
  2080.          break;
  2081.        }
  2082.     }
  2083.     else gets(dst_path);
  2084.  
  2085.     return(dst_path);
  2086. }
  2087.  
  2088. /* Show file information */
  2089.  
  2090. int show_file_info(char *fnp)
  2091. {
  2092.     int file_error=0;
  2093.     int i=0;
  2094.     char file_name[13];
  2095.     char new_file_name[13];
  2096.     char datebuf[10];
  2097.     char *fn;
  2098.     char key;
  2099.     int file=1;
  2100.     int handle=0;
  2101.     long int length=0;
  2102.     unsigned fdate,ftime;
  2103.  
  2104.     fn=fnp;
  2105.     fn+=((cur_page-1)*1152);
  2106.     i=cp-1;
  2107.     fn+=i*16 + 2;
  2108.     strcpy(file_name,fn);
  2109.     _settextposition(23,1);
  2110.     _settextcolor(14);
  2111.     _setbkcolor(9);
  2112.       for(i=0;i<6;i++){
  2113.         _outtext("                                       ");
  2114.       }
  2115.     _settextposition(24,1);
  2116.  
  2117.     fn-=2;
  2118.     if(*fn == 'F')file=1;
  2119.     if(*fn == 'N')file=1;
  2120.     if(*fn == 'D')file=0;
  2121.     if(file){
  2122.       printf( " %s ",file_name);
  2123.       handle=open(file_name,O_RDONLY);
  2124.       if(handle != -1){
  2125.         length=filelength(handle);
  2126.         printf(" %lu",length);
  2127.         _dos_getftime( handle, &fdate, &ftime );
  2128.         datestr( fdate, datebuf );
  2129.         printf(" %s",datebuf);
  2130.         close(handle);
  2131.       }
  2132.       time(&p_time);
  2133.       if(file_error!=0){
  2134.         _settextposition(23,1);
  2135.         for(i=0;i<6;i++){
  2136.           _outtext("                                       ");
  2137.         }
  2138.         _settextposition(24,1);
  2139.         printf("File error %u",errno);
  2140.         perror(fmsg);
  2141.       }
  2142.      time(&c_time);
  2143.      while((c_time-p_time) < 2){
  2144.        time(&c_time);
  2145.      };
  2146.      }
  2147.     display_menu();
  2148.  
  2149.     return(file_error);
  2150. }
  2151.  
  2152. /* Takes unsigned date in the format:               fedcba9876543210
  2153.  * d=1-31, m=1-12, y=0-119 (1980-2099)              yyyyyyymmmmddddd
  2154.  * Changes to a 9-byte string:                      mm/dd/yy
  2155.  */
  2156. char *datestr( unsigned d, char *buf )
  2157. {
  2158.     sprintf( buf, "%2.2d/%02.2d/%02.2d",
  2159.          (d >> 5) & 0x0f, d & 0x1f, (d >> 9) + 80 );
  2160.     return buf;
  2161. }
  2162.  
  2163. int find_dv(void)
  2164. {
  2165.     int dv=0;
  2166.     _asm{
  2167.       push bx
  2168.       push cx
  2169.       push dx
  2170.       mov cx,04445h
  2171.       mov dx,05351h
  2172.       mov ax,2b01h
  2173.       int 21h
  2174.       cmp al,0ffh
  2175.       je no_desqview
  2176.       mov ax,bx
  2177.       jmp dvgv_x
  2178. no_desqview:
  2179.       sub ax,ax
  2180. dvgv_x:
  2181.       mov dv,ax
  2182.       pop dx
  2183.       pop cx
  2184.       pop bx
  2185.      }
  2186.      return(dv);
  2187. }
  2188.  
  2189. void reg_SBPlay(void)
  2190. {
  2191.     char key;
  2192.     char input[80];
  2193.     int x1=15,x2=17;
  2194.     int y1=15,y2=50;
  2195.     int attr=15;
  2196.     int box_type=2;
  2197.     int *screen;
  2198.     int ok=0;
  2199.     long int password=0x20b230aa;
  2200.     long int *pw;
  2201.     long int pwn;
  2202.     char user_pw[5];
  2203.     short row1,row2;
  2204.     short col1,col2;
  2205.     struct rccoord oldpos;
  2206.  
  2207.     user_pw[4]=0;
  2208.     oldpos=_gettextposition();
  2209.     _gettextwindow(&row1,&col1,&row2,&col2);
  2210.     screen=save_screen(x1, y1, x2, y2);
  2211.     draw_box(box_type, x1, y1, x2, y2, attr);
  2212.     _settextwindow(x1+1,y1+1,x2-1,y2-1);
  2213.     _settextcursor(0x707);
  2214.     _outtext(" Register (y/N)? ");
  2215.     key=getche();
  2216.     if(key=='Y' | key=='y'){
  2217.        _outtext("\nPassword? ");
  2218.        gets(input);
  2219.        strncpy(user_pw,input,4);
  2220.        pw=(long *)user_pw;
  2221.        pwn=*(pw)/2;
  2222.        if(password==pwn){
  2223.          _outtext("\nName? ");
  2224.          gets(input);
  2225.          if(strlen(input)<40)strcpy(reg_name,input);
  2226.          _outtext("\nRegistration Number? ");
  2227.          gets(input);
  2228.          _outtext("\n");
  2229.          if(strlen(input)<10)strcpy(ser_number,input);
  2230.          save_defaults();
  2231.        }
  2232.        else {
  2233.          _outtext("\nIncorrect Password!");
  2234.          time(&p_time);
  2235.          time(&c_time);
  2236.          while((c_time-p_time) < 2){
  2237.            time(&c_time);
  2238.          };
  2239.  
  2240.        }
  2241.     }
  2242.     _settextcursor(0x2000);
  2243.     restore_screen(screen, x1, y1, x2, y2);
  2244.     _settextwindow(row1,col1,row2,col2);
  2245.     _settextposition(oldpos.row, oldpos.col);
  2246. }
  2247.  
  2248.  
  2249.